#coding:utf8
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible
from mall import settings
#1.您的自定义存储系统必须是以下子类 django.core.files.storage.Storage：
#  4. django.utils.deconstruct.deconstructible类装饰器

@deconstructible
class MyStorage(Storage):

    #2.Django必须能够在没有任何参数的情况下实例化您的存储系统。
    # 这意味着任何设置都应该来自django.conf.settings
    def __init__(self, conf_path = None,ip = None):
        if not conf_path:
            conf_path = settings.FDFS_CLIENT_CONF
        self.conf_path = conf_path

        if not ip:
            ip = settings.FDFS_URL

        self.ip = ip



    #3.您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法

    # 打开图片
    # 我们的图片是通过 http:// 访问来获取到的
    # 所以不需要打开
    def _open(self, name, mode='rb'):
        pass


    # 保存
    def _save(self, name, content, max_length=None):


        #1. 创建FastDFS客户端

        #客户端的配置信息路径
        # client = Fdfs_client('utils/fastdfs/client.conf')
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)

        client = Fdfs_client(self.conf_path)

        #2. 获取图片

        # name  只是图片的名字
        # 只有一个名字我们没有办法实现上传

        # content 内容
        # content就是图片的内容数据,我们通过 read来读取
        # 读取的是二进制数据
        data = content.read()


        #3. 上传

        # client.upload_by_filename()  根据文件的绝对路径来上传

        #upload_by_buffer  上传二进制

        # result 就是上传的结果
        result =  client.upload_by_buffer(data)
        """

        {'Local file name': '/home/python/Desktop/images/1.jpg',
        'Status': 'Upload successed.', 'Storage IP': '192.168.229.133',
        'Group name': 'group1',
        'Remote file_id': 'group1/M00/00/03/wKjlhVvqiNmAbdPbAAAyZgOTZN0750.jpg',
        'Uploaded size': '12.00KB'}


        """
        #4. 根据上传的结果 获取file_id
        if result.get('Status') == 'Upload successed.':
            file_id = result.get('Remote file_id')

            #我们把file_id 返回给系统就可以
            return file_id
        else:
            raise Exception('上传失败')





# class Person(object):
#
#     def __init__(self,name=None):
#
#         pass
#
#
#
# p = Person()


    # 判断是否存在exists
    # 因为 Fdfs实现了文件的去重处理, 会对重复的文件进行重命名处理
    # 所以 不需要判断是否存在,尽管上传
    def exists(self, name):
        return False


    def url(self, name):
        # name 其实就是 file_id

        # url 应该是一个 http://ip:port/ + name 才可以完整的访问我们的图片
        # return 'http://192.168.229.133:8888/' + name
        # return settings.FDFS_URL + name
        return self.ip + name


